package com.aleyn.router.plug.task

import org.gradle.api.DefaultTask
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.TaskAction
import java.io.File

/**
 * @author: Aleyn
 * @date: 2024/4/1 15:27
 */
abstract class RouterStubClassTask : DefaultTask() {

    @get:OutputDirectory
    abstract val outputFolder: DirectoryProperty

    /**
     * Gradle 任务的执行入口。
     *
     * 该任务的主要作用是生成一个名为 `LRouterGenerateImpl.kt` 的桩文件。
     * 这个文件包含一个空的 `LRouterGenerateImpl` 类，它实现了 `ILRouterGenerate` 接口。
     *
     * 这个桩文件只在主应用模块（app module）中生成，它作为一个占位符，
     * 后续会由 `LRouterClassTask` 任务通过 ASM 字节码插桩技术，
     * 将所有模块的路由、拦截器、初始化器等注册逻辑填充到这个类中。
     *
     * 在 `${variant.name}RouterStubClass` 任务执行时被 Gradle 调用。
     */
    @TaskAction
    fun taskAction() {
        val outputFile = File(outputFolder.asFile.get(), "com/router/LRouterGenerateImpl.kt")
        outputFile.parentFile.mkdirs()
        outputFile.writeText(
            """
                package com.router

                import androidx.annotation.Keep
                import com.aleyn.router.inject.ILRouterGenerate

                /**
                 * 插桩类，自动生成
                 */
                @Keep
                class LRouterGenerateImpl : ILRouterGenerate {

                    @Keep
                    override fun injectAutowired(target: Any?) {
                    }

                    @Keep
                    override fun initModuleRouter() {
                    }

                    @Keep
                    override fun registerIntercept() {
                    }

                    @Keep
                    override fun registerAllInitializer() {
                    }
                }
            """.trimIndent()
        )
    }
}